Completed
Push — master ( 1da48a...f95778 )
by Sander
01:12
created

$j.ready   B

Complexity

Conditions 3
Paths 1

Size

Total Lines 28

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
c 1
b 0
f 0
nc 1
nop 2
dl 0
loc 28
rs 8.8571
1
/* global API */
2
var $j = jQuery.noConflict();
3
$j(document).ready(function () {
4
    var _this = this;
5
6
    function removePasswordPicker() {
7
        $j('.passwordPickerIframe').remove();
8
    }
9
    _this.removePasswordPicker = removePasswordPicker;
10
11
    function enterLoginDetails(login) {
12
        var username = (login.username.trim() !== '' ) ? login.username : login.email;
13
14
        fillPassword(username, login.password);
15
        if ($j('.passwordPickerIframe').is(':visible')) {
16
            removePasswordPicker();
17
        }
18
    }
19
20
    _this.enterLoginDetails = enterLoginDetails;
21
22
23
    function showPasswordPicker(form) {
24
        if($j('.passwordPickerIframe').length > 1){
25
            return;
26
        }
27
        var loginField = $j(form[0]);
28
        var loginFieldPos = loginField.offset();
29
        var position = $j(form[1]).position();
0 ignored issues
show
Unused Code introduced by
The assignment to variable position seems to be never used. Consider removing it.
Loading history...
30
        var passwordField = $j(form[1]);
31
        var passwordFieldPos = passwordField.offset();
32
33
        var left = loginFieldPos.left;
34
        var top = loginFieldPos.top;
35
        
36
        if (passwordFieldPos.top > loginFieldPos.top) {
37
            //console.log('login fields below each other')
38
            top = passwordFieldPos.top + passwordField.height() + 10;
39
40
        } else {
41
            // console.log('login fields next to each other')
42
            top = top + loginField.height() + 10;
43
        }
44
45
46
        var pickerUrl = API.extension.getURL('/html/inject/password_picker.html');
47
48
        var picker = $j('<iframe class="passwordPickerIframe" scrolling="no" height="400" width="350" frameborder="0" src="'+ pickerUrl+'"></iframe>');
49
        picker.css('position', 'absolute');
50
        picker.css('left', left);
51
        picker.css('z-index', 999);
52
        picker.css('top', top);
53
        $j('body').append($j(picker));
54
        // picker.css('width', $j(form).width());
55
        $j('.passwordPickerIframe:not(:last)').remove();
56
    }
57
58
    function createFormIcon(el, form) {
59
        var offset = el.offset();
0 ignored issues
show
Unused Code introduced by
The assignment to variable offset seems to be never used. Consider removing it.
Loading history...
60
        var width = el.width();
61
        var height = el.height()*1;
62
        var margin = (el.css('margin')) ? parseInt(el.css('margin').replace('px', '')) : 0;
0 ignored issues
show
Unused Code introduced by
The variable margin seems to be never used. Consider removing it.
Loading history...
63
        var padding = (el.css('padding')) ? parseInt(el.css('padding').replace('px', '')) : 0;
0 ignored issues
show
Unused Code introduced by
The variable padding seems to be never used. Consider removing it.
Loading history...
64
65
        var pickerIcon = 'data:image/png;base64,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';
66
        
67
        $j(el).css('background-image', 'url("'+ pickerIcon +'")');
68
        $j(el).css('background-size', 'contain');
69
        $j(el).css('background-repeat', 'no-repeat');
70
        $j(el).css('background-position-x', 'right');
71
72
73
        function onClick (e) {
74
            e.preventDefault();
75
            var offsetX = e.offsetX;
76
            var offsetRight = (width - offsetX);
77
            if(offsetRight < height){
78
                showPasswordPicker(form);
79
            }
80
        }
81
82
       // $j(el).bind('click', onClick);
83
        $j(el).click(onClick);
84
85
    }
86
87
    function createPasswordPicker(form) {
88
        for (var i = 0; i < form.length; i++) {
89
            var el = $j(form[i]);
90
            createFormIcon(el, form);
91
92
        }
93
    }
94
95
    function updatePositions() {
0 ignored issues
show
introduced by
The function updatePositions does not seem to be used and can be removed.
Loading history...
96
        $j('.passwordPickerIcon').remove();
97
        var forms = getLoginFields();
98
        for (var f = 0; f < forms.length; f++) {
99
            var form = forms[f];
100
            for (var i = 0; i < form.length; i++) {
101
                var el = $j(form[i]);
102
                createFormIcon(el, form);
103
            }
104
        }
105
    }
106
107
108
    function formSubmitted(fields) {
109
        var user = fields[0].value;
110
        var pass = fields[1].value;
111
        var params = {
112
            username: user,
113
            password: pass
114
        };
115
        //Disable password mining
116
        //$j(fields[1]).attr('type', 'hidden');
117
        API.runtime.sendMessage(API.runtime.id, {method: "minedForm", args: params});
118
119
    }
120
121
    function inIframe() {
122
        try {
123
            return window.self !== window.top;
124
        } catch (e) {
125
            return true;
126
        }
127
    }
128
129
    function showDoorhanger(data) {
130
        if(inIframe()){
131
            return;
132
        }
133
        var doorhanger_div = $j('<div id="password-toolbar" style="display: none;">');
134
        $j('<span>',{
135
            class:'toolbar-text',
136
            text: data.title + ' ' + data.username + ' at ' + data.url
137
        }).appendTo(doorhanger_div);
138
139
        var btnText = (data.guid === null) ? 'Save' : 'Update';
140
        var btnSave = $j('<button class="passman-btn passnman-btn-success">' + btnText + '</button>');
141
        var btnCancel = $j('<button class="passman-btn passnman-btn-default">Cancel</button>');
142
        btnSave.click(function () {
143
            //closeToolbar();
144
            API.runtime.sendMessage(API.runtime.id, {method: "saveMined"});
145
            doorhanger_div.find('.toolbar-text').text('Saving...');
146
            doorhanger_div.find('.passman-btn').hide();
147
        });
148
149
        btnCancel.click(function () {
150
            closeToolbar();
151
            API.runtime.sendMessage(API.runtime.id, {method: "clearMined"});
152
        });
153
154
        doorhanger_div.append(btnCancel).append(btnSave);
155
        $j('#password-toolbar').remove();
156
        $j('body').append(doorhanger_div);
157
        $j('#password-toolbar').slideDown();
158
    }
159
160
    function checkForMined() {
161
        if (inIframe()) {
162
            return;
163
        }
164
        if(getLoginFields()){
165
            return;
166
        }
167
168
        API.runtime.sendMessage(API.runtime.id, {method: "getMinedData"}).then(function (data) {
169
            if (!data) {
170
                return;
171
            }
172
            if (data.hasOwnProperty('username') && data.hasOwnProperty('password') && data.hasOwnProperty('url')) {
173
                showDoorhanger(data);
174
            }
175
        });
176
    }
177
178
    function minedLoginSaved(args) {
179
        // If the login added by the user then this is true
180
        if (args.selfAdded) {
181
            enterLoginDetails(args.credential);
182
            return;
183
        }
184
        if ($j('#password-toolbar').is(':visible')) {
185
            var action = (args.updated) ? 'updated' : 'saved';
186
            $j('#password-toolbar').html('Credential ' + action + '!');
187
            setTimeout(function () {
188
                closeToolbar();
189
            }, 2500);
190
        }
191
    }
192
193
    _this.minedLoginSaved = minedLoginSaved;
194
195
    function closeToolbar() {
196
        $j('#password-toolbar').slideUp(400, function () {
197
            $j('#password-toolbar').remove();
198
        });
199
    }
200
201
202
    function init() {
203
        checkForMined();
204
        API.runtime.sendMessage(API.runtime.id, {method: 'getRuntimeSettings'}).then(function (result) {
205
            var disablePasswordPicker = result.disablePasswordPicker;
206
207
            var loginFields = getLoginFields();
208
            if (loginFields.length > 0) {
209
                //@TODO prevent chrome from captuting pw's: http://stackoverflow.com/questions/27280461/prevent-chrome-from-prompting-to-save-password-from-input-box
210
                for (var i = 0; i < loginFields.length; i++) {
211
                    var form = getFormFromElement(loginFields[i][0]);
212
                    if(!disablePasswordPicker) {
213
                        createPasswordPicker(loginFields[i], form);
0 ignored issues
show
Bug introduced by
The call to createPasswordPicker seems to have too many arguments starting with form.
Loading history...
214
                    }
215
                    //Password miner
216
                    /* jshint ignore:start */
217
                    $j(form).submit((function (loginFields) {
218
                        return function () {
219
                            formSubmitted(loginFields);
220
                        };
221
                    })(loginFields[i]));
222
                    /* jshint ignore:end */
223
                }
224
225
                var url = window.location.href; //@TODO use a extension function
226
                API.runtime.sendMessage(API.runtime.id, {
227
                    method: "getCredentialsByUrl",
228
                    args: [url]
229
                }).then(function (logins) {
230
                    //console.log('Found ' + logins.length + ' logins for this site');
231
                    if (logins.length === 1) {
232
                        API.runtime.sendMessage(API.runtime.id, {method: 'isAutoFillEnabled'}).then(function (isEnabled) {
233
                            if (isEnabled) {
234
                                enterLoginDetails(logins[0]);
235
                            }
236
                        });
237
                    }
238
239
                });
240
            }
241
242
        });
243
244
    }
245
246
    var readyStateCheckInterval = setInterval(function () {
247
        if (document.readyState === "complete") {
248
            clearInterval(readyStateCheckInterval);
249
            API.runtime.sendMessage(API.runtime.id, {method: 'getMasterPasswordSet'}).then(function (result) {
250
                if (result) {
251
                    init();
252
                } else {
253
                    console.log('[Passman extension] Stopping, vault key not set');
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
254
                }
255
            });
256
257
            // var body = document.getElementsByTagName('body')[0];
258
            // observeDOM(body, function () {
259
            //     //init()
260
            // });
261
        }
262
    }, 10);
263
264
    API.runtime.onMessage.addListener(function (msg, sender, sendResponse) {
0 ignored issues
show
Unused Code introduced by
The parameter sendResponse is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
265
        //console.log('Method call', msg.method);
266
        if(_this[msg.method]) {
267
            _this[msg.method](msg.args, sender);
268
        }
269
    });
270
});